package com.atguigu.exam.service.impl;

import com.atguigu.exam.entity.Banner;
import com.atguigu.exam.mapper.BannerMapper;
import com.atguigu.exam.service.BannerService;

import com.atguigu.exam.service.FileUploadService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mysql.cj.log.Log;
import io.minio.errors.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 轮播图服务实现类
 */
@Service
@Slf4j
public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements BannerService {

    @Autowired
    private FileUploadService fileUploadService;
    @Override
    public String uploadImage(MultipartFile file) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
//        1.非空检验,检验上传的文件是不是空
        if (file.isEmpty()){
            throw new RuntimeException("请选择需要上传的文件！");
        }
//        2.图片已上传，那么检验图片格式
        String contentType = file.getContentType();
        if (ObjectUtils.isEmpty(contentType) || !contentType.startsWith("image")){
//            如果图片格式为空或者并非image格式，配合全局异常处理，快速返回失败结果：
            throw new RuntimeException("轮播图只能上传图片文件！");
        }
//        3.文件大小限制：
        if (file.getSize() >5 * 1024 * 1024){
//            如果文件大小超限制，这配合全局异常处理快速返回失败结果！
            throw new RuntimeException("图片文件大小不可以超过5MB！");
        }
//        4.调用文件上传业务
        String imgUrl = fileUploadService.upload(file,"banners");
//        5.返回结果
        log.info("完成banner图上传，图片回显地址：{}",imgUrl);
        return imgUrl;
    }

    @Override
    public void addBanner(Banner banner) {
//        1.确认客户端传来的轮播图对象有创建时间和更新时间（可以在实体类中设置自动填充）
//        2.判断轮播图的启动状态,如果没启动，就把它启动起来
        if (banner.getIsActive() == null){
            banner.setIsActive(true);
        }
//        3.判断优先级,如果没有优先级属性，就设置为0
        if (banner.getSortOrder() == null){
            banner.setSortOrder(0);
        }
//        4.保存这个轮播图进数据库
        boolean isSuccess = save(banner);
        if (!isSuccess){
            throw new RuntimeException("轮播图保存失败！");
        }
        log.info("轮播图保存成功！");
    }

    @Override
    public void updateBanner(Banner banner) {
        boolean success = this.updateById(banner);
        if (!success){
            throw new RuntimeException("轮播图更新失败！");
        }
    }
}